#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include <cstring>
#include <iostream>
using namespace std;

void sighandler(int signo) {
  sleep(2);
  printf("parent process catch a signal: %d\n", signo);
  cout << endl;
  waitpid(-1, nullptr, WNOHANG);
}

int main() {
//   signal(SIGCHLD, sighandler);
  signal(SIGCHLD, SIG_IGN);

  pid_t id = fork();
  if (id == 0) {
    // child
    int cnt = 2;
    while (cnt--) {
      printf("I am child process,the PID is %d\n", getpid());
      cout << endl;
      sleep(1);
    }
    cout << "child process quit...." << endl<<endl;;
    exit(-1);
  }
  // parent
  while (1) {
    printf("I am parent process,the PID is %d\n", getpid());
    cout << endl;

    sleep(1);
  }

  return 0;
}

// volatile int flag = 1;

// void sighandler(int signo) {
//   printf("sighandler get a signal: %d\n", signo);
//   flag = 0;
//   printf("falg : %d\n", flag);
// }

// int main() {
//   signal(SIGINT, sighandler);
//   while (flag);

//   cout << "process quit sucess" << endl;
// }

// void PrintPending() {
//   sigset_t pending;
//   sigemptyset(&pending);
//   sigpending(&pending);

//   for (int i = 31; i > 0; --i) {
//     if (sigismember(&pending, i))
//       cout << "1";
//     else
//       cout << "0";
//   }
//   cout << endl;
// }

// void sighandler(int signo) {
//   // 自定义处理动作
//   //   PrintPending();
//   printf("sighandler get a signal: %d\n", signo);
//   while (1) {
//     PrintPending();
//     cout << endl;
//     sleep(1);
//   }
// }

// int main() {
//   struct sigaction act, oldact;

//   memset(&act, 0, sizeof(act));  // 利用memset()初始化结构体
//   memset(&act, 0, sizeof(oldact));

//   sigset_t mask;
//   sigemptyset(&mask);

//   // 使用sigaddset()设置信号集
//   sigaddset(&mask, 3);
//   sigaddset(&mask, 4);
//   sigaddset(&mask, 1);
//   sigaddset(&mask, 5);

//   act.sa_mask = mask;  // 将设置好的信号集进行赋值从而设置处理时阻塞

//   act.sa_handler = sighandler;  // 为成员赋值 设置自定义处理动作
//   int n = sigaction(SIGINT, &act, &oldact);  // 函数调用
//   while (!n) {                               // 循环打印
//     cout << "I am a Process ,id : " << getpid() << endl;
//     sleep(1);
//   }
//   return 0;
// }

// void PrintPending() {
//   sigset_t pending;
//   sigemptyset(&pending);
//   sigpending(&pending);

//   for (int i = 31; i > 0; --i) {
//     if (sigismember(&pending, i))
//       cout << "1";
//     else
//       cout << "0";
//   }
//   cout << endl;
// }

// void sighandler(int signo) {
//   // 自定义处理动作
//   //   PrintPending();
//   printf("sighandler get a signal: %d\n", signo);
//   while (1) {
//     PrintPending();
//     cout << endl;
//     sleep(1);
//   }
// }

// int main() {
//   struct sigaction act, oldact;

//   memset(&act, 0, sizeof(act));  // 利用memset()初始化结构体
//   memset(&act, 0, sizeof(oldact));

//   act.sa_handler = sighandler;  // 为成员赋值 设置自定义处理动作
//   int n = sigaction(SIGINT, &act, &oldact);  // 函数调用
//   while (!n) {                               // 循环打印
//     cout << "I am a Process ,id : " << getpid() << endl;
//     sleep(1);
//   }
//   return 0;
// }

// // sigset_t mask;
// // sigemptyset(&mask);
